#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include "stbimage.h"
#include "stbimageWrite.h"
#include "IPFunResNew.h"


void load_img() {
	pathToFile = origem;
	fileToPath = destino;
    printf("Path to file: ");
	gets(origem);
	printf("File to path: ");
	gets(destino);
	dataOrig = stbi_load(pathToFile, &row, &col, &n,0);
	vectorSize = row * col;
	printf("%lu\n", vectorSize);
	printf("%d\n", n);

}

/*====================CONTROL MENU=================================*/
int menu(int i) {
        printf("1  - Carregar imagem\n");
        printf("2  - Aplicar Filtro\n");
        printf("3  - Aplicar Sepia\n");
        printf("4  - Aplicar Negativo\n");
        printf("5  - Fechar Programa\n\n");
        printf("Escolha uma opcao: ");
        scanf("%d", &i);
		fflush(stdin);
        return i;
}

void histograma(){
	 STATISTICA stat;
     int j, i = 0, Y, X;
     int indice = 0;
     int *hist;
     int faixa[8] = { 0 };
     FILE * arq;
	 /* abrindo um arquivo */
     arq = fopen("teste.txt", "a");

     /* pegando os valores de 0 - 255 de cada pixel */
     hist = malloc(vectorSize * sizeof(int));
	 for (Y = 0; Y < row; Y++) {
		 for (X = 0; X < col; X++) {
			 indice = (int) (*(dataOrig + Y + X * col));
			// printf("%d", indice);
			 hist[i++] = indice;
		 }
	 }

	 /* separando esses valores por cada faixa */
     for (i = 0; i < vectorSize; i++){
		 if (hist[i] <= 31)
			 faixa[0]++;
		 if ((hist[i] >= 32) && (hist[i] <= 63))
			 faixa[1]++;
		 if ((hist[i] >= 64) && (hist[i] <= 95))
			 faixa[2]++;
		 if ((hist[i] >= 96) && (hist[i] <= 127))
             faixa[3]++;
         if ((hist[i] >= 128) && (hist[i] <= 159))
             faixa[4]++;
         if ((hist[i] >= 160) && (hist[i] <= 191))
             faixa[5]++;
         if ((hist[i] >= 192) && (hist[i] <= 224))
             faixa[6]++;
         if ((hist[i] >= 225) && (hist[i] <= 255))
             faixa[7]++;
	 }
	 /* para cada 1048 pixel de cada faixa vale uma estrela */
     faixa[0] = faixa[0] / 1048;
     faixa[1] = faixa[1] / 1048;
     faixa[2] = faixa[2] / 1048;
     faixa[3] = faixa[3] / 1048;
     faixa[4] = faixa[4] / 1048;
     faixa[5] = faixa[5] / 1048;
     faixa[6] = faixa[6] / 1048;
     faixa[7] = faixa[7] / 1048;

     /* quardando todos os valores para dentro da estrutura STATICA */
     for (j = 0; j < 8; j++){
		if (faixa[j] != 0){
			stat.statistica[j] = malloc(faixa[j] * sizeof(char));
			for (i = 0; i < faixa[j]; i++) {
				(stat.statistica[j])[i] = (char) '*';
			}
			(stat.statistica[j])[--i] = '\0';
		} else {
			stat.statistica[j] = malloc(sizeof(char));
            (stat.statistica[j])[0] = '\0';
		}
	 }
	 /* imprimir em tela e em arquivo */
     printf(" 0 - 31 de Intensidade: %s\n", stat.statistica[0]);
     fputs(" 0 - 31 de Intensidade:", arq);
     fputs(stat.statistica[0], arq);
     fputs("\n", arq);

     printf("32- 63 de Intensidade: %s\n", stat.statistica[1]);
     fputs("32- 63 de Intensidade:", arq);
     fputs(stat.statistica[1], arq);
     fputs("\n", arq);

     printf("64 - 95 de Intensidade: %s\n", stat.statistica[2]);
     fputs("64 - 95 de Intensidade:", arq);
     fputs(stat.statistica[2], arq);
     fputs("\n", arq);
	 printf("96 - 127 de Intensidade: %s\n", stat.statistica[3]);
     fputs("96 - 127 de Intensidade:", arq);
     fputs(stat.statistica[3], arq);
     fputs("\n", arq);
	 printf("128 - 159 de Intensidade: %s\n", stat.statistica[4]);
     fputs("128 - 159 de Intensidade:", arq);
     fputs(stat.statistica[4], arq);
     fputs("\n", arq);
	 printf("160 - 191 de Intensidade: %s\n", stat.statistica[5]);
     fputs("160 - 191 de Intensidade:", arq);
     fputs(stat.statistica[5], arq);
     fputs("\n", arq);
	 printf("192 - 224 de Intensidade: %s\n", stat.statistica[6]);
     fputs("192 - 224 de Intensidade:", arq);
     fputs(stat.statistica[6], arq);
     fputs("\n", arq);
	 printf("225 - 255 de Intensidade: %s\n", stat.statistica[7]);
     fputs("225 - 255 de Intensidade:", arq);
     fputs(stat.statistica[7], arq);
     fputs("\n", arq);

     /* fechar o arquivo */
     fclose(arq);
}


int compare(const void * a, const void * b) {
        return (*(int*) a - *(int*) b);
}


void oper_min(){
	unsigned char *dataDest;
    unsigned int X, Y, pixel;
    int I, J, vetor[9], k = 0;

	dataDest = malloc(vectorSize * sizeof(unsigned char));

	for (Y = 0; Y <= row-1; Y++){
		for (X = 0; X <= col-1; X++){
			pixel = 0;
			/* image boundaries */
			if (Y == 0 || Y == row-1)
				pixel = 0;
			else if (X == 0 || X == col-1)
				pixel = 0;
			/* Convolution starts here */
			else{

				/*------GRADIENT APPROXIMATION------*/
				for (I = -1; I <= 1; I++){
					for (J = -1; J <= 1; J++){
						pixel = (int) ((*(dataOrig + X + I + (Y + J) * col)));
						vetor[k] = pixel;
						k++;
						}
					}
					k = 0;
					qsort(vetor, 9, sizeof(int), compare);
					pixel = vetor[0];
					}
			if (pixel > 255)
				pixel = 255;
			if (pixel < 0)
				pixel = 0;

			*(dataDest + X + Y * col) = (int) (pixel);
			}
		}

		stbi_write_bmp( fileToPath, row, col, n, dataDest);
}


void filtroCor(){
	int tam,i,c;
	int *R, *G, *B;
	char RGB[10];
	printf("Digite a cor do Filtro\n");
	gets(RGB);
	fflush(stdin);
	tam = row * col;
	R =(int*) malloc(tam * sizeof(int));
	G =(int*) malloc(tam * sizeof(int));
	B =(int*) malloc(tam * sizeof(int));
	//canal4 =(int*) malloc(tam * sizeof(int));
	for(i = 0,c= 0; i < tam;i++,c++){
		R[i] = dataOrig[c];
		c++;
		G[i] = dataOrig[c];
		c++;
		B[i] = dataOrig[c];

	}
	if(strcmp(RGB,"vermelho") == 0){
		for(i = 0; i < tam;i++){
			G[i] = 0;
			B[i] = 0;
		}
	}

	if(strcmp(RGB,"verde") == 0){
		for(i = 0; i < tam;i++){
			R[i] = 0;
			B[i] = 0;
		}
	}

	if(strcmp(RGB,"azul") == 0){
		for(i = 0; i < tam;i++){
			R[i] = 0;
			G[i] = 0;

		}
	}

	for(i = 0,c= 0; i < tam;i++,c++){
		dataOrig[c] = R[i];
		c++;
		dataOrig[c] = G[i];
		c++;
		dataOrig[c] = B[i];
	}
	stbi_write_bmp( fileToPath, row, col, n, dataOrig);

}


void inverter(){
	int tam,i,c;
	int *R, *G, *B;
	tam = row * col;
	R =(int*) malloc(tam * sizeof(int));
	G =(int*) malloc(tam * sizeof(int));
	B =(int*) malloc(tam * sizeof(int));
	//canal4 =(int*) malloc(tam * sizeof(int));
	for(i = 0,c= 0; i < tam;i++,c++){
		R[i] = dataOrig[c];
		c++;
		G[i] = dataOrig[c];
		c++;
		B[i] = dataOrig[c];

	}

	for(i = 0; i < tam;i++){
		R[i] = abs(R[i]-255);
		G[i] = abs(G[i]-255);
		B[i] = abs(B[i]-255);
	}

	for(i = 0,c= 0; i < tam;i++,c++){
		dataOrig[c] = R[i];
		c++;
		dataOrig[c] = G[i];
		c++;
		dataOrig[c] = B[i];


	}
	stbi_write_bmp( fileToPath, row, col, n, dataOrig);

}


void sepiaCor(){
	int tam,i,c,fs = 20, gry;
	int *R, *G, *B;
	tam = row * col;
	R =(int*) malloc(tam * sizeof(int));
	G =(int*) malloc(tam * sizeof(int));
	B =(int*) malloc(tam * sizeof(int));
	//canal4 =(int*) malloc(tam * sizeof(int));
	for(i = 0,c= 0; i < tam;i++,c++){
		R[i] = dataOrig[c];
		c++;
		G[i] = dataOrig[c];
		c++;
		B[i] = dataOrig[c];

	}

	for(i = 0; i < tam;i++){
		gry = (R[i] + G[i] + B[i])/3;
		R[i] = G[i] = B[i] = gry;
		R[i] = R[i] + (fs * 2);
		G[i] = G[i] + fs;

		if(R[i] > 255) R[i] = 255;
		if(G[i] > 255) G[i] = 255;
		if(B[i] > 255) B[i] = 255;
	}


	for(i = 0,c= 0; i < tam;i++,c++){
		dataOrig[c] = R[i];
		c++;
		dataOrig[c] = G[i];
		c++;
		dataOrig[c] = B[i];

	}
	stbi_write_bmp( fileToPath, row, col, n, dataOrig);

}

